題目:
(6 級) Casino chips
你將得到三疊賭場籌碼:白色、綠色和黑色
第一疊皆為白色籌碼
第二疊皆為綠色籌碼
第三疊皆為黑色籌碼
你每天只能拿不同顏色的兩個籌碼去賭場。你可以任意挑選顏色,但不能拿兩個同樣顏色的籌碼。
你將得到一組陣列顯示每種顏色籌碼的數量,而你的任務是回傳找出拿取籌碼的最多天數。每天你只能拿兩個籌碼。
範例:
solve([1,1,1]) => 1
因為第一天拿取後將只剩下一個籌碼
solve([1,2,1]) => 2
可以拿兩天,第一天拿兩個,第二天拿兩個
solve([4,1,1]) => 2
Ruby 解法:
def solve(arr)
# 先將 arr 由小到大排序
arr = arr.sort
# 找出最大數字和第二大數字之間的相差
diff = arr[2] - arr[1]
# 將計算天數的參數 count 初始值設為 0
count = 0
# 先把天數加上第二大數字
count += arr[1]
# 如果相差大於最小數字
if diff >= arr[0]
# 天數直接加上最小數字
count += arr[0]
else
# 反之則先加上相差
count += diff
# 再加上平攤之後的最小數字
count += (arr[0] - diff) / 2
end
# 最後回傳計算的天數
count
end
JavaScript 解法:
function solve(arr){
// 先將 arr 由小到大排序
arr.sort((a, b) => a > b ? 1 : -1);
// 找出最大數字和第二大數字之間的相差
let diff = arr[2] - arr[1]
// 將計算天數的參數 count 初始值設為 0
let count = 0
// 先把天數加上第二大數字
count += arr[1]
// 如果相差大於最小數字
if (diff >= arr[0]) {
// 天數直接加上最小數字
count += arr[0]
} else {
// 反之則先加上相差
count += diff
// 再加上平攤之後的最小數字
count += (arr[0] - diff) / 2
}
// 最後回傳取整數後的天數
return Math.floor(count)
}